js中 构造函数prototype属性 实例化对象 proto 属性 以及原型链的总结
1 注意区分
prototype是构造函数的属性,可以直接操作,所有的实例化对象可以共享由其创建的属性或者方法,也就数说,当函数被new调用的时候,实例化的对象上才有原型上的属性,但是不用new,而直接调用的时候,却没有;
proto 是实例化对象的属性,该属性是JS对象上的隐藏属性,这个属性指向的是该对象 对应构造函数的prototype属性;该属性不可实际操作;
实例化的对象里面包括 实例化的属性 + proto 属性 ,
proto 属性里面又包含constructor 属性和 proto (原型链终点)
1.1 test.prototype.property = “value”; test.prototype.property =function(){ };直接向原型中添加属性,
|
|
|
|
|
|
构造函数首字母一般要大写,这里由于开始的疏忽,暂时用小写
1.2 test.prototype = new test2 ( ) ;改变实例对象的proto原型指向;
|
|
1.3 所有的函数的 proto 指向 构造函数 Function.prototype ;
所有实例对象的 proto 指向 对应构造函数的 prototype属性: arr. proto === Array.prototype
所有构造函数的prototype属性中有一个constructor属性,指向其构造函数
在Javascript中每个函数都有一个prototype属性和 proto 属性,
- 其中所有函数 的 proto 属性指向Function的 prototype属性,
- 所有实例化对象 的 proto 属性指向其对应 的构造函数的 prototype 属性;
|
|
1.4 注意区分函数也是对象,但是对象不一定是函数;Function是所有函数的构造函数,包括内置构造函数(内置对象,如果给Function的prototype添加了属性,那么所有通过构造函数new出来的对象都会在 proto 属性中有该属性)
|
|
1.5 有点绕
- 所有的函数都有prototype属性,同时也都有 proto 属性,该属性指向Function构造函数的prototype属性;Function的 proto 属性指向Object构造函数,函数也是对象;
- 所有的对象都有 proto 属性,指向该对象的构造函数的prototype属性
2 原型继承,所谓的继承,其实就是一个构造函数原型指向另外一个构造函数的实例化对象
2.1 原型继承的所有的属性由 所有 的实例化的对象共享,一个改变,其余的都会改变,这是原形继承的一个缺点;
2.2 原型的继承方式:借助构造函数继承、组合继承
2.3 原型继承要注意理解复杂类型传递的是数据在堆内存中的地址;
2.4.1 不使用prototype属性定义的对象方法,是静态方法,只能直接用类名进行调用!另外,此静态方法中无法使用this变量来调用对象其他的属性!
2.4.2 使用prototype属性定义的对象方法,是非静态方法,只有在实例化后才能使用!其方法内部可以this来引用对象自身中的其他属性!